#include "pch.hpp"
#include "TableDL.hpp"
#include "RDBMS.hpp"

using namespace db;




TableDL::TableDL(QString name, QString dbName, Attributes attributes)
	: m_name(name)
	, m_dbName(dbName)
	, m_attributes(attributes)
{
	foreach(Attribute::const_Ptr attribute, attributes)
	{
		m_columns.insert(attribute->name(), attribute);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

TableDL::~TableDL()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




bool TableDL::exists(Connection::Ptr connection) const
{
	// TODO: Better method of checking if the table exists...
	QSqlQuery query = connection->try_execute(QString("SELECT COUNT(*) FROM %1").arg(dbName()));
	return query.lastError().type() == QSqlError::NoError; //< No error means the table exists
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void TableDL::create(Connection::Ptr connection)
{
	QString query = connection->rdbms()->createTableString(boost::shared_static_cast<const TableDL>(shared_from_this()));
	connection->execute(query);
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void TableDL::drop(Connection::Ptr connection)
{
	Table::const_Ptr _this = shared_from_this();
	QString query = connection->rdbms()->dropTableString(boost::shared_static_cast<const TableDL>(shared_from_this()));
	connection->execute(query);
}
///////////////////////////////////////////////////////////////////////////////////////////////////




QString TableDL::name() const
{
	return m_name;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QString TableDL::dbName() const
{
	return m_dbName;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

std::size_t TableDL::numAttributes() const
{
	return m_attributes.size();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Attribute::const_Ptr TableDL::attribute(std::size_t i) const
{
	verify(i < m_attributes.size());
	return m_attributes[i];
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Attribute::const_Ptr TableDL::attribute(QString name) const
{
	Columns::const_iterator i = m_columns.find(name);
	verify(i != m_columns.end());
	return *i;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
